// 使用 promise + async await 实现异步循环打印

let sleep = function (time, i){
    return new Promise(function(resolve, reject){ 
        setTimeout(() => {
            resolve(i);
        }, time);
    })
}

let start = async function() {
    for(let i = 0; i < 66; i++){
        let res = await sleep(1000, i);
        console.log(res);
    }
};

start();
console.log('外部任务');



/*  
ES2017 async 函数
async 函数对 Generator 函数改进
1. 内置执行器
2. 更好的语义化
    async 表示函数里面有异步操作
    await 表示紧跟在后面的表达式需要等待结果
3. 更广的适用性
4. 返回值是promise
    返回值可以用 then 方法指定下一步操作

基本用法
async 函数返回一个Promise对象，可以使用 then方法添加回调函数
当函数执行的时候，一旦遇到await就会先返回，等到异步操作完成，
再接着执行函数体内后面的语句
*/

// async 函数的多种使用形式
async function foo() {}

const foo = async function() { }

let obj = { async foo() {}}
obj.foo().then()

// 箭头函数
const foo = async () => {};



async function f(){ 
    throw new Error('出错了');
}
f().then(
    v => console.log('resolve', v),
    e => console.log('reject', e)
)